package com.ms.p2p.template.method;


import freemarker.template.SimpleScalar;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateMethodModelEx;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;

import java.math.BigDecimal;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 处理货币精度标签
 *
 */
@Repository
public class CurrencyMethod implements TemplateMethodModelEx {

	@SuppressWarnings("rawtypes")
	public Object exec(List arguments) {
		if (arguments != null && !arguments.isEmpty() && arguments.get(0) != null && 
				StringUtils.isNotEmpty(arguments.get(0).toString())) {
			boolean flag = false;
			boolean flag1 = false;

			String money = arguments.get(0).toString();
			Pattern pattern=Pattern.compile("^(([1-9]{1}\\d*)|([0]{1}))(\\.(\\d)+)?$"); // 判断小数点后2位的数字的正则表达式
			Matcher match=pattern.matcher(money);
			if(!match.matches()){
				return null;
			}

			if (arguments.size() == 2) {
				if (arguments.get(1) != null)
					flag = Boolean.valueOf(arguments.get(1).toString());
			} else{
				if (arguments.size() > 2) {
					if (arguments.get(1) != null)
						flag = Boolean.valueOf(arguments.get(1).toString());
					if (arguments.get(2) != null)
						flag1 = Boolean.valueOf(arguments.get(2).toString());
				}
			}

			BigDecimal bigdecimal = new BigDecimal(arguments.get(0).toString());
			String s = setScale(bigdecimal).toString();
			if (flag)
				s = (new StringBuilder("￥")).append(s).toString();
			if (flag1)
				s = (new StringBuilder(String.valueOf(s))).append("元").toString();
			return new SimpleScalar(s);
		} else {
			return null;
		}
	}

	//价格处理精度
	public BigDecimal setScale(BigDecimal amount) {
		if (amount == null) {
			return null;
		}
		int roundingMode;
//		if (getPriceRoundType() == RoundType.roundUp) {
			roundingMode = 0;
//		} else {
//			if (getPriceRoundType() == RoundType.roundDown) {
//				roundingMode = 1;
//			} else {
//				roundingMode = 4;
//			}
//		}
		return amount.setScale(2, roundingMode);
	}

	// 小数位精确方式（四舍五入、向上取整、向下取整）
//	public enum RoundType {
//		roundHalfUp, roundUp, roundDown
//	}
}
